home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
extend.exe
/
EXTEND.DOC
< prev
next >
Wrap
Text File
|
1992-11-30
|
20KB
|
369 lines
(*
EXTEND.PAS
Version 6
November 30, 1992
by Scott Bussinger
Compuserve 72247,2671
MS-DOS and PC-DOS Turbo Pascal 3.0 and higher only allow up to 15 files to
be open at the same time, due to limitations in DOS. This file shows you how
to have up to 96 files open simultaneously under DOS 2.0 or 2.1, or 252 files
open simultaneously under DOS 3.0 or higher. Below is a description of how to
use this technique, followed by a technical explanation of the implementation,
for those who are interested. Note this documentation is liberally based on
the original EXTEND.PAS documentation by Randy Forgaard, but has been renamed
to EXTEND.DOC and modified by Scott Bussinger to reflect the changes to
involved in versions 2 and 3.
TO USE THIS TECHNIQUE:
You simply include the EXTEND unit in the USES statement in the source code
of your main program. You will have to either compile the EXTEND unit
separately or use Turbo Pascal 4.0's project compiling features to Make or
Build your program (which will compile the EXTEND unit automatically). The
EXTEND unit should be the first unit in your USES statement, following only
the DOS unit (which is USEd by the EXTEND unit). The unit automatically
installs itself and will uninstall itself when your program ends or an error
is detected. See the demo program below for an example of using the EXTEND
unit.
The EXTEND.PAS file will need to be available available to be compiled if
the Make or Build features are used to compile the program. The EXTEND.ASM
is the source code for the assembly language interrupt handler used when
running under DOS 2. The EXTEND.OBJ file is the assembled object code for
EXTEND.ASM and was compiled using A86, a shareware compiler available on
Compuserve and other bulletin boards.
You must edit your CONFIG.SYS file (see the DOS manual for details), so
that it includes a line that says "FILES=XXX". XXX should be a number that is
at least 3 greater than the maximum number of files that will be in use
(opened by RESET, REWRITE or APPEND) at the same time during the execution of
your program (larger values will provide no additional benefit, with respect
to your individual program), and should not exceed 99 (for DOS 2.0/2.1) or 255
(for DOS 3.0 and higher). Under any version of DOS, the minimum allowable
value for XXX is 8. Then, reboot your computer so that the FILES=XXX
parameter takes hold. This same change to the CONFIG.SYS file will have to be
made on any machine in which your program is to run.
Running the sample program at the bottom of this file will tell you the
maximum number of files you can have open at once (usually 3 less than the
number of files specified in the CONFIG.SYS file as discussed above, unless a
resident program has opened some files and hasn't closed them yet).
THE TECHNICAL DETAILS:
Much of the following information is not documented in the DOS Technical
Reference manual.
Under DOS 1.0 and 1.1, all files were accessed via File Control Blocks
(FCB's). There was no limit to the number of FCB's that a program could use,
so there was no limit to the number of files open simultaneously.
Under DOS 2.0 and higher, an alternate (and preferable) method of accessing
files was introduced, using a 2-byte integer called a "handle" to refer to a
file. A "handle" file is described using a data structure called a Device
Control Block (DCB). However, DOS provides the storage space for all DCB's,
rather than having the application program store the DCB's, so the number of
available DCB's is limited to the amount of space that DOS has set aside for
them. The maximum number of files/devices that can be open simultaneously, on
the whole computer, is the number of slots available in the DCB Table created
by DOS. The DCB's in the DCB Table are consecutively numbered, starting with
0. DCB's 0, 1, and 2 are predefined by DOS to correspond to the AUX, CON, and
PRN devices, respectively. All remaining DCB's in the DCB Table are available
for files or devices used by application programs.
So that I/O redirection can be supported, the DCB numbers are not used
directly when accessing files. Instead, a file "handle" is used. A "handle"
is an index into a 20-byte array, called the Handle Table, located at offset
18H of the Program Segment Prefix (PSP) for a program (for a general
discussion of the PSP, see the DOS Technical Reference manual). Each element
of the Handle Table is the DCB number of a file or device. The value at index
"handle" in the Handle Table is the DCB number of the file or device that
implements that file handle. Thus, if the value 8 is in the 6th byte of the
Handle Table, the handle "6" refers to the file (or device) described by the
DCB in slot 8 of the DCB Table. If a handle is not currently being used, its
entry in the Handle Table is FFH. DOS predefines the first 5 handles to be
primary input, primary output, error, auxiliary, and printer, so the first 5
entries in the Handle Table are 1, 1, 1, 0, and 2, corresponding to the DCB
numbers for the CON (1), AUX (0), and PRN (2) devices. This leaves only 15
available handles for opening files (or new devices).
Every time a new handle file is opened, a new handle gets used. Since there
are only 20 slots available in the Handle Table for a program, DOS only allows
a "process" to have a maximum of 20 file handles in use simultaneously (and the
first 5 entries are predefined, as just noted, unless those handles get closed
and reused). Every new handle file requires a unique handle, so only 20
files/devices can be open at the same time by a single process (unless FCB's
are used). (A "process" is any program spawned using the DOS EXEC function
call. A process can be invoked by COMMAND.COM, or by another program.) There
can be many more than 20 DCB's in the DCB Table, so the real limitation is in
the size of the Handle Table in the PSP.
The size of the DCB Table (i.e., the maximum number of files/devices that
can be open simultaneously in the whole computer) is controlled by the
FILES=XXX entry in the CONFIG.SYS file. The minimum number of slots is 8.
Under DOS 2.0/2.1, the maximum number is 99, and under DOS 3.0 and higher,
the maximum is 255. As previously mentioned, the first three of these DCB
slots are occupied by the AUX, CON, and PRN devices.
A single program can use all of the DCB's in the DCB Table (except for the 3
reserved by DOS) all on its own, by effectively bypassing the Handle Table in
the PSP, except on a temporary basis. The program can accomplish this feat by
using, say, only one entry in the Handle Table for all of its files. Instead
of allowing DOS to store the DCB numbers in the Handle Table, the program can
store these numbers elsewhere. Then, to manipulate a file using DOS, the
program can temporarily put the DCB number of that file into a designated slot
in the Handle Table, pass the index of that table slot (i.e., that "handle")
to DOS, and DOS will operate on that handle/DCB number. After the DOS call,
the program can remove that DCB number from the designated Handle Table slot,
freeing up that handle for use in another DOS call for another file. In this
way, DOS can be fooled into accessing up to 96 (or 252) different files/devices
using a single handle entry in the Handle Table.
To obtain the address of the Handle Table, which is at offset 18H in the
PSP, the program needs to find the address of its PSP. Under Turbo Pascal
4.0, the segment address of the PSP is stored in a pre-defined variable called
PrefixSeg setup by Turbo's standard initialization code. All of the
manipulation of the DCB's and handles is dealt with by ExtendHandler which is
an interrupt handler which intercepts all DOS functions calls (INT 21) and
checks to see if the function involves a handle number. If the function
returns a handle (e.g. an Open File) it then return